/**
 */
package fUML.Semantics.Classes.Kernel;

import fUML.Syntax.Classes.Kernel.StructuralFeature;

import org.eclipse.emf.common.util.EList;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Structured Value</b></em>'.
 * <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * A structured value is a Value whose type has structural features: a data type
 *                 (but not a primitive type or enumeration), a class or an association.
 * <!-- end-model-doc -->
 *
 *
 * @see fUML.Semantics.Classes.Kernel.KernelPackage#getStructuredValue()
 * @model abstract="true"
 * @generated
 */
public interface StructuredValue extends Value {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Get the feature value associated with the given feature. 
	 *  The given
	 *                   feature must be a structural feature of the type of the structured value.
	 *                 
	 * <!-- end-model-doc -->
	 * @model required="true" ordered="false" featureRequired="true" featureOrdered="false"
	 * @generated
	 */
	FeatureValue getFeatureValue(StructuralFeature feature);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Set the value(s) and, optionally, the position index associated with the given
	 *                   feature. 
	 *  The given feature must be a structural feature of the type of
	 *                   the structured value.
	 *  
	 * <!-- end-model-doc -->
	 * @model featureRequired="true" featureOrdered="false" valuesMany="true" valuesOrdered="false" positionOrdered="false"
	 * @generated
	 */
	void setFeatureValue(StructuralFeature feature, EList<Value> values, int position);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Return the feature values associated with this structural value.
	 *                 
	 * <!-- end-model-doc -->
	 * @model kind="operation" ordered="false"
	 * @generated
	 */
	EList<FeatureValue> getFeatureValues();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * // Create empty feature values for all structural features, direct and
	 *                   inherited, of the types of this structured value.
	 *  
	 *                   ClassifierList types = this.getTypes();
	 *  
	 *  for (int i = 0; i
	 *                   < types.size(); i++) {
	 *  Classifier type =
	 *                   types.getValue(i);
	 *  NamedElementList members = type.member;
	 *                   
	 *  for (int j = 0; j < members.size(); j++) {
	 *  NamedElement
	 *                   member = members.getValue(j);
	 *  if (member instanceof StructuralFeature)
	 *                   {
	 *  this.setFeatureValue((StructuralFeature)member, new ValueList(),
	 *                   0);
	 *  }
	 *  }
	 *  }
	 *  
	 * <!-- end-model-doc -->
	 * @model
	 * @generated
	 */
	void createFeatureValues();

} // StructuredValue
